﻿package com.zouloux.utils 
{
	import flash.display.Graphics;
	import flash.geom.Point;
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class GraphicUtils
	{
		/**
		 * Tracer un bout de cercle
		 * @param	pGraphics : L'objet graphics à transmettre
		 * @param	pAngle1 : L'angle de départ
		 * @param	pAngle2 : L'angle de fin
		 * @param	pRadius : Le rayon de la portion de cercle à tracer
		 */
		public static function drawCircleSegment (pGraphics:Graphics, pAngle1:Number, pAngle2:Number, pRadius:Number, pPosition:Point = null, pLineTo:Boolean = true, pInvert:Boolean = false):void
		{
			// Créer le point s'il est null
			if (pPosition == null)
				pPosition = new Point();
			
			// Calculer l'espace entre les 2 angles
			var diff	:Number		= Math.abs(pAngle2 - pAngle1);
			
			// Calculer le nombre de points à placer
			var divs	:Number		= Math.floor(diff / (Math.PI / 4)) + 1;
			
			// Calculer l'écart entre 2 points
			var span	:Number		= (pInvert ? 1 : -1 ) *diff / (2 * divs);
			
			// Calculer le rayon pour les ancres
			var rc		:Number		= pRadius / Math.cos(span);
			
			// Placer le premier point
			if (pLineTo)
				pGraphics.lineTo(pPosition.x + Math.cos(pAngle1) * pRadius, pPosition.y + Math.sin(pAngle1) * pRadius);
			else
				pGraphics.moveTo(pPosition.x + Math.cos(pAngle1) * pRadius, pPosition.y + Math.sin(pAngle1) * pRadius);
			
			// Placer les points
			for (var i:uint = 0; i < divs; ++i)
			{
				// Calculer les nouvelles position
				pAngle2 = pAngle1 + span;
				pAngle1 = pAngle2 + span;
				
				// Tracer
				pGraphics.curveTo(
					pPosition.x + Math.cos(pAngle2) * rc,
					pPosition.y + Math.sin(pAngle2) * rc,
					pPosition.x + Math.cos(pAngle1) * pRadius,
					pPosition.y + Math.sin(pAngle1) * pRadius
				);
			};
		}
	}
}